package arch.chameleon.support.util;

import java.net.InetAddress;

/**
 * UUID生成器
 * 
 * @author George
 * 
 */
public class UUIDGenerator {
	private UUIDGenerator() {
	};

	/**
	 * 创建20位长度，80Bits的UUID
	 * @return
	 */
	public static String create20LenUUID() {
		return new StringBuffer(20)
				.append(UUIDHelper.format(UUIDHelper.getIP()))
				.append(UUIDHelper.format(UUIDHelper.getLoTime()))
				.append(UUIDHelper.format(UUIDHelper.getCount())).toString();
	}

	private static final class UUIDHelper {
		private static final int IP;

		private static short counter = (short) 0;

		private static final int JVM = (int) (System.currentTimeMillis() >>> 8);

		static {
			int ipadd;
			try {
				ipadd = ip2Int(InetAddress.getLocalHost().getAddress());
			} catch (Exception e) {
				ipadd = 0;
			}
			IP = ipadd;
		}

		private UUIDHelper() {
		}

		private final static int ip2Int(byte[] bytes) {
			int result = 0;
			for (int i = 0; i < 4; i++) {
				result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i];
			}
			return result;
		}

		private static short getCount() {
			synchronized (UUIDHelper.class) {
				if (counter < 0)
					counter = 0;
				return counter++;
			}
		}

		private static int getIP() {
			return IP;
		}

		private static int getJVM() {
			return JVM;
		}

		private static short getHiTime() {
			return (short) (System.currentTimeMillis() >>> 32);
		}

		private static int getLoTime() {
			return (int) System.currentTimeMillis();
		}

		private static short getShortLoTime() {
			return (short) System.currentTimeMillis();
		}

		private static String format(short shortval) {
			String formatted = Integer.toHexString(shortval);
			StringBuffer buf = new StringBuffer("0000");
			buf.replace(4 - formatted.length(), 4, formatted);
			return buf.toString();
		}

		private static String format(int intval) {
			String formatted = Integer.toHexString(intval);
			StringBuffer buf = new StringBuffer("00000000");
			buf.replace(8 - formatted.length(), 8, formatted);
			return buf.toString();
		}
	}
}
